﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Atomic.Common;
using System.Linq.Expressions;

namespace Atomic.Db
{
    /// <summary>
    /// 对NHibernate进行一次初级封装，泛型方法实现常用的CRUD方法，避免重复编写代码
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public interface IBaseDAL<T> : IError
    {
        /// <summary>
        /// 通过主键用户对象信息
        /// </summary>
        /// <param name="id">主键</param>
        /// <returns>对象信息</returns>
        T Get(object id);

        /// <summary>
        /// 进行对象验证，并新建对象
        /// </summary>
        /// <param name="entity">要创建的对象，创建后设置为创建后的结果</param>
        /// <returns>返回的主键ID</returns>
        object Add(T entity);

        /// <summary>
        /// 删除对象，如果对象配置了Hibernate级联，则会进行级联删除
        /// </summary>
        /// <param name="id">要删除对象的主键</param>
        void Remove(object id);

        /// <summary>
        /// 分页查询数据，按数据库默认顺序排序查询结果
        /// </summary>
        /// <param name="pager">分页参数</param>
        /// <param name="predicate">查询筛选条件</param>
        /// <returns>分页查询结果</returns>
        Pager<T> GetPager(Pager pager, Expression<Func<T, bool>> predicate = null);

        /// <summary>
        /// 条件查询所有满足条件的结果
        /// </summary>
        /// <param name="predicate">查询条件</param>
        /// <returns>满足条件的查询结果</returns>
        List<T> GetList(Expression<Func<T, bool>> predicate = null);

        /// <summary>
        /// 更新对象，更新前会进行对象属性值的有效性验证
        /// </summary>
        /// <param name="entity">更新对象</param>
        /// <param name="id">更新对象的主键</param>
        void Update(T entity, object id);

        /// <summary>
        /// 是否存在指定条件的记录
        /// </summary>
        /// <param name="predicate">查询条件</param>
        /// <returns>是否存在指定记录信息</returns>
        bool Exist(Expression<Func<T, bool>> predicate = null);
    }
}
